package com.temp.utils;

import cn.hutool.crypto.digest.DigestUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;

public class EpusdtSignUtil {

    /**
     * 生成EPUSDT签名
     * @param params 参数Map
     * @param apiKey API密钥
     * @return 签名
     */
    public static String generateSign(Map<String, Object> params, String apiKey) {
        // 1. 过滤空值并排序
        Map<String, Object> sortedParams = new TreeMap<>();
        params.forEach((key, value) -> {
            if (value != null && StringUtils.isNotBlank(value.toString())) {
                sortedParams.put(key, value);
            }
        });

        // 2. 拼接键值对
        StringBuilder signStr = new StringBuilder();
        sortedParams.forEach((key, value) -> {
            if (signStr.length() > 0) {
                signStr.append("&");
            }
            signStr.append(key).append("=").append(value);
        });

        // 3. 拼接API密钥并MD5加密
        signStr.append(apiKey);
        return DigestUtil.md5Hex(signStr.toString()).toLowerCase();
    }

    /**
     * 验证回调签名
     * @param params 回调参数
     * @param apiKey API密钥
     * @return 是否验证通过
     */
    public static boolean verifySign(JSONObject params, String apiKey) {
        String receivedSign = params.getString("Signature");
        if (StringUtils.isBlank(receivedSign)) {
            return false;
        }

        // 复制参数并移除signature
        Map<String, Object> verifyParams = new HashMap<>(params);
        verifyParams.remove("Signature");

        // 生成签名
        String generatedSign = generateSign(verifyParams, apiKey);
        return generatedSign.equals(receivedSign);
    }

    /**
     * 生成订单ID
     * 格式: 年月日时分秒 + 4位随机数
     * 示例: 202308151430459999
     */
    public static String generateOrderId() {
        // 1. 获取当前时间戳
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String timePart = sdf.format(new Date());

        // 2. 生成4位随机数
        int randomNum = ThreadLocalRandom.current().nextInt(1000, 9999);

        // 3. 组合成订单ID
        return timePart + randomNum;
    }
}